/*     */ package com.zimbra.cs.db;
/*     */ 
/*     */ import com.zimbra.common.localconfig.KnownKey;
/*     */ import com.zimbra.common.localconfig.LC;
/*     */ import com.zimbra.common.service.ServiceException;
/*     */ import com.zimbra.common.util.Log;
/*     */ import com.zimbra.common.util.ZimbraLog;
/*     */ import com.zimbra.cs.mailbox.Mailbox;
/*     */ import java.sql.Connection;
/*     */ import java.sql.SQLException;
/*     */ import java.sql.Statement;
/*     */ import org.apache.commons.dbcp.PoolingDataSource;
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ public abstract class Db
/*     */ {
/*     */   private static Db sDatabase;
/*     */   
/*     */   public static enum Error
/*     */   {
/*  38 */     DEADLOCK_DETECTED, 
/*  39 */     DUPLICATE_ROW, 
/*  40 */     FOREIGN_KEY_CHILD_EXISTS, 
/*  41 */     FOREIGN_KEY_NO_PARENT, 
/*  42 */     NO_SUCH_DATABASE, 
/*  43 */     NO_SUCH_TABLE, 
/*  44 */     TOO_MANY_SQL_PARAMS, 
/*  45 */     BUSY, 
/*  46 */     LOCKED, 
/*  47 */     CANTOPEN, 
/*  48 */     TABLE_FULL;
/*     */     
/*     */     private Error() {} }
/*     */   
/*  52 */   public static enum Capability { BITWISE_OPERATIONS, 
/*  53 */     BOOLEAN_DATATYPE, 
/*  54 */     CASE_SENSITIVE_COMPARISON, 
/*  55 */     CAST_AS_BIGINT, 
/*  56 */     CLOB_COMPARISON, 
/*  57 */     DISABLE_CONSTRAINT_CHECK, 
/*  58 */     FILE_PER_DATABASE, 
/*  59 */     LIMIT_CLAUSE, 
/*  60 */     MULTITABLE_UPDATE, 
/*  61 */     NON_BMP_CHARACTERS, 
/*  62 */     ON_DUPLICATE_KEY, 
/*  63 */     ON_UPDATE_CASCADE, 
/*  64 */     READ_COMMITTED_ISOLATION, 
/*  65 */     REPLACE_INTO, 
/*  66 */     ROW_LEVEL_LOCKING, 
/*  67 */     UNIQUE_NAME_INDEX, 
/*  68 */     AVOID_OR_IN_WHERE_CLAUSE, 
/*  69 */     REQUEST_UTF8_UNICODE_COLLATION, 
/*  70 */     FORCE_INDEX_EVEN_IF_NO_SORT, 
/*  71 */     SQL_PARAM_LIMIT, 
/*  72 */     DUMPSTER_TABLES;
/*     */     
/*     */     private Capability() {}
/*     */   }
/*     */   
/*  77 */   private static String ESCAPE_SEQUENCE = "\\";
/*     */   private static final int DEFAULT_IN_CLAUSE_BATCH_SIZE = 400;
/*     */   
/*  80 */   public static synchronized Db getInstance() { if (sDatabase == null) {
/*  81 */       String className = LC.zimbra_class_database.value();
/*  82 */       if ((className != null) && (!className.equals(""))) {
/*     */         try {
/*  84 */           sDatabase = (Db)Class.forName(className).newInstance();
/*     */         } catch (Exception e) {
/*  86 */           ZimbraLog.system.error("could not instantiate database configuration '" + className + "'; defaulting to MySQL", e);
/*     */         }
/*     */       }
/*  89 */       if (sDatabase == null)
/*  90 */         sDatabase = new MariaDB();
/*  91 */       ESCAPE_SEQUENCE = sDatabase.escapeSequence();
/*     */     }
/*  93 */     return sDatabase;
/*     */   }
/*     */   
/*     */ 
/*     */   public static boolean supports(Capability capability)
/*     */   {
/*  99 */     return getInstance().supportsCapability(capability);
/*     */   }
/*     */   
/*     */ 
/*     */   abstract boolean supportsCapability(Capability paramCapability);
/*     */   
/*     */   public static boolean errorMatches(SQLException e, Error error)
/*     */   {
/* 107 */     return getInstance().compareError(e, error);
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   abstract boolean compareError(SQLException paramSQLException, Error paramError);
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   abstract DbPool.PoolConfig getPoolConfig();
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   void startup(PoolingDataSource pool, int poolSize)
/*     */     throws SQLException
/*     */   {}
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   void shutdown() {}
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   void postCreate(Connection conn)
/*     */     throws SQLException
/*     */   {}
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   void postOpen(DbPool.DbConnection conn)
/*     */     throws SQLException
/*     */   {}
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   void preOpen(Integer mboxId) {}
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   void abortOpen(Integer mboxId) {}
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   public void optimize(DbPool.DbConnection conn, String name, int level)
/*     */     throws ServiceException
/*     */   {}
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   public static void registerDatabaseInterest(DbPool.DbConnection conn, Mailbox mbox)
/*     */     throws ServiceException
/*     */   {
/*     */     try
/*     */     {
/* 173 */       getInstance().registerDatabaseInterest(conn, DbMailbox.getDatabaseName(mbox));
/*     */     } catch (SQLException e) {
/* 175 */       throw ServiceException.FAILURE("error registering interest in database " + DbMailbox.getDatabaseName(mbox), e);
/*     */     }
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */   void registerDatabaseInterest(DbPool.DbConnection conn, String dbname)
/*     */     throws SQLException, ServiceException
/*     */   {}
/*     */   
/*     */ 
/*     */ 
/*     */   void preClose(DbPool.DbConnection conn)
/*     */     throws SQLException
/*     */   {}
/*     */   
/*     */ 
/*     */ 
/*     */   public abstract boolean databaseExists(DbPool.DbConnection paramDbConnection, String paramString)
/*     */     throws ServiceException;
/*     */   
/*     */ 
/*     */   void precreateDatabase(String dbname) {}
/*     */   
/*     */ 
/*     */   void deleteDatabaseFile(DbPool.DbConnection conn, String dbname)
/*     */   {
/* 202 */     throw new UnsupportedOperationException("DB is not file-per-database");
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public static String forceIndex(String index)
/*     */   {
/* 211 */     if ((index == null) || (index.trim().equals("")))
/* 212 */       return "";
/* 213 */     return getInstance().forceIndexClause(index);
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */   abstract String forceIndexClause(String paramString);
/*     */   
/*     */ 
/*     */   public String scriptCommandDelimiter()
/*     */   {
/* 223 */     return ";";
/*     */   }
/*     */   
/*     */   protected int getInClauseBatchSize()
/*     */   {
/* 228 */     return 400;
/*     */   }
/*     */   
/*     */ 
/*     */   public static int getINClauseBatchSize()
/*     */   {
/* 234 */     return getInstance().getInClauseBatchSize();
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   static String selectBOOLEAN(String clause)
/*     */   {
/* 242 */     if (supports(Capability.BOOLEAN_DATATYPE)) {
/* 243 */       return clause;
/*     */     }
/* 245 */     return "CASE WHEN " + clause + " THEN 1 ELSE 0 END";
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   static String equalsSTRING(String column)
/*     */   {
/* 255 */     if (supports(Capability.CASE_SENSITIVE_COMPARISON)) {
/* 256 */       return "UPPER(" + column + ") = UPPER(?)";
/*     */     }
/* 258 */     return column + " = ?";
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   static String likeSTRING(String column)
/*     */   {
/* 268 */     if (supports(Capability.CASE_SENSITIVE_COMPARISON)) {
/* 269 */       return "UPPER(" + column + ") LIKE UPPER(?)";
/*     */     }
/* 271 */     return column + " LIKE ?";
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */   public abstract String bitAND(String paramString1, String paramString2);
/*     */   
/*     */ 
/*     */ 
/*     */   public abstract String bitANDNOT(String paramString1, String paramString2);
/*     */   
/*     */ 
/*     */ 
/*     */   public void enableStreaming(Statement stmt)
/*     */     throws SQLException
/*     */   {}
/*     */   
/*     */ 
/*     */   public static String clauseIFNULL(String expr1, String expr2)
/*     */   {
/* 291 */     return getInstance().getIFNULLClause(expr1, expr2);
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */   abstract String getIFNULLClause(String paramString1, String paramString2);
/*     */   
/*     */ 
/*     */ 
/*     */   public abstract void flushToDisk();
/*     */   
/*     */ 
/*     */ 
/*     */   public void checkParamLimit(int numParams)
/*     */     throws ServiceException
/*     */   {}
/*     */   
/*     */ 
/*     */ 
/*     */   public int getParamLimit()
/*     */   {
/* 312 */     return Integer.MAX_VALUE;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public abstract String concat(String... paramVarArgs);
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   public abstract String sign(String paramString);
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   public abstract String lpad(String paramString1, int paramInt, String paramString2);
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   public String limit(int limit)
/*     */   {
/* 336 */     return limit(0, limit);
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public String limit(int offset, int limit)
/*     */   {
/* 349 */     return "";
/*     */   }
/*     */   
/*     */   protected String escapeSequence() {
/* 353 */     return "\\";
/*     */   }
/*     */   
/*     */   public static String getEscapeSequence() {
/* 357 */     return ESCAPE_SEQUENCE;
/*     */   }
/*     */ }


/* Location:              /home/mint/zimbrastore.jar!/com/zimbra/cs/db/Db.class
 * Java compiler version: 7 (51.0)
 * JD-Core Version:       0.7.1
 */